index.js ➔ ... ➔ prepare   A
last analyzed

Complexity

Conditions 3
Paths 4

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 4
nc 4
nop 1
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
'use strict';
2
const from = require('from2');
3
const pIsPromise = require('p-is-promise');
4
5
module.exports = x => {
6
	if (Array.isArray(x)) {
7
		x = x.slice();
8
	}
9
10
	let promise;
11
	let iterator;
12
13
	prepare(x);
14
15
	function prepare(value) {
0 ignored issues
show
Bug introduced by
The function prepare is declared conditionally. This is not supported by all runtimes. Consider moving it to root scope or using var prepare = function() { /* ... */ }; instead.
Loading history...
16
		x = value;
17
		promise = pIsPromise(x) ? x : null;
18
		// we don't iterate on strings and buffers since slicing them is ~7x faster
19
		const shouldIterate = !promise && x[Symbol.iterator] && typeof x !== 'string' && !Buffer.isBuffer(x);
0 ignored issues
show
Bug introduced by
The variable Symbol seems to be never declared. If this is a global, consider adding a /** global: Symbol */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
Bug introduced by
The variable Buffer seems to be never declared. If this is a global, consider adding a /** global: Buffer */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
20
		iterator = shouldIterate ? x[Symbol.iterator]() : null;
21
	}
22
23
	return from(function reader(size, cb) {
24
		if (promise) {
25
			promise.then(prepare).then(() => reader.call(this, size, cb), cb);
26
			return;
27
		}
28
29
		if (iterator) {
30
			const obj = iterator.next();
31
			setImmediate(cb, null, obj.done ? null : obj.value);
32
			return;
33
		}
34
35
		if (x.length === 0) {
36
			setImmediate(cb, null, null);
37
			return;
38
		}
39
40
		const chunk = x.slice(0, size);
41
		x = x.slice(size);
42
43
		setImmediate(cb, null, chunk);
44
	});
45
};
46
47
module.exports.obj = x => {
48
	if (Array.isArray(x)) {
49
		x = x.slice();
50
	}
51
52
	let promise;
53
	let iterator;
54
55
	prepare(x);
56
57
	function prepare(value) {
0 ignored issues
show
Bug introduced by
The function prepare is declared conditionally. This is not supported by all runtimes. Consider moving it to root scope or using var prepare = function() { /* ... */ }; instead.
Loading history...
58
		x = value;
59
		promise = pIsPromise(x) ? x : null;
60
		iterator = !promise && x[Symbol.iterator] ? x[Symbol.iterator]() : null;
0 ignored issues
show
Bug introduced by
The variable Symbol seems to be never declared. If this is a global, consider adding a /** global: Symbol */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
61
	}
62
63
	return from.obj(function reader(size, cb) {
64
		if (promise) {
65
			promise.then(prepare).then(() => reader.call(this, size, cb), cb);
66
			return;
67
		}
68
69
		if (iterator) {
70
			const obj = iterator.next();
71
			setImmediate(cb, null, obj.done ? null : obj.value);
72
			return;
73
		}
74
75
		this.push(x);
76
77
		setImmediate(cb, null, null);
78
	});
79
};
80